/**
 * 
 */
package si.unimb.src.wifisms.util;

import java.util.ArrayList;
import java.util.StringTokenizer;

import si.unimb.src.wifisms.entity.SMSMessage;
import si.unimb.src.wifisms.entity.Settings;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.*;
import android.widget.Toast;

/**
 * @author perox
 * Statičen razred z raznimi uporabnimi funkcijami. 
 */
public class Utility {
	
	/**
	 * Šifra za prehod med različnimi Intenti, ki predstavlja, da se med njimi ne pošiljajo informacije (extras).
	 */
	public static final int NO_EXTRAS = -1;
	
	/**
	 * Minimalna dolžina gesla.
	 */
	public static final int PASSWORD_MIN_LENGTH = 6;
	
	/**
	 * Statične spremenljivke za vnos SMS-a v Android bazo
	 */
	private static final String ADDRESS = "address";
	//private static final String PERSON = "person";
	private static final String DATE = "date";
	private static final String READ = "read";
	private static final String STATUS = "status";
	private static final String TYPE = "type";
	private static final String BODY = "body";
	//private static final int MESSAGE_TYPE_INBOX = 1;
	private static final int MESSAGE_TYPE_SENT = 2;
	
	/**
	 * Funkcija pretvori ArrayList element v String. 
	 * @param element je posamezen ArrayString element.
	 * @return Vrne pretvorjen element v obliki String objekta.
	 */
	public static String ArrayListToString(ArrayList<?> element) {
		String temp = removeBrackets(element.toString());
		
		/* v primeru, ko dodamo kontakt iz imenika, se na koncu doda ',  ' in to moramo odrezati */
		if (temp.endsWith(",  "))
			temp = temp.substring(0, temp.length() - 3);
		
		return temp;
	}
	
	/**
	 * Funkcija pretvori String element v ArrayList. 
	 * @param multiEditTextContent je string, ki ga želimo spremeniti v ArrayList. 
	 * @return Vrne pretvorjen element v obliki ArrayList objekta.
	 */
	public static ArrayList<String> StringToArrayList(String multiEditTextContent) {
		
		// TODO: preglej to funkcijo, če dela pravilno
		ArrayList<String> list = new ArrayList<String>();
		StringTokenizer tokens = new StringTokenizer(removeSpaces(multiEditTextContent), ",", false);
		while(tokens.hasMoreTokens()){
			list.add(tokens.nextElement().toString());
		}
		
		return list;
	}
	
	/**
	 * Funkcija izbriše oglate oklepaje
	 * @param s string, ki ga želimo spremeniti.
	 * @return urejen string, brez oglatih oklepajev.
	 */
	public static String removeBrackets(String s) {
		StringTokenizer st = new StringTokenizer(s,"[]", false);
		String t="";
		while (st.hasMoreElements())
			t += st.nextElement();
		
		return t;
	}
	
	public static String numberCleanUp(String number) {
		
		// Odstranimo ves tekst pred cifro (ime in priimek pa to)
		int pozicija = number.indexOf("<");
		
		if(pozicija != -1) {
		
			number = number.substring(pozicija);
			
		}
		
		// Odstranimo vse znake, ki ne sodijo v telefonsko številko
		return number.replaceAll("[^0-9\\+]", "");
		
	}
	
	/**
	 * Funkcija izbriše prazna mesta
	 * @param s string, ki ga želimo spremeniti.
	 * @return urejen string, brez praznih mest
	 */
	public static String removeSpaces(String s) {
	  	StringTokenizer st = new StringTokenizer(s, " ", false);
	  	String t = new String();
	  	while (st.hasMoreElements()) {
	  		
	  		/* malo sem zakompliciral, ampak zaenkrat deluje */
	  		if (t.length() == 0) { // če je string še prazen, se kar del pripiše
	  			t += st.nextElement();
	  		} else if (t.charAt(t.length()-1) != ',') { // če na zadnjem mestu ni vejice (torej to ni nov prejemenik), se na začetek doda presledek 
  				t += " " + st.nextElement();
	  		} else
	  			t += st.nextElement(); // to velja večinoma samo za ročno vpisane št., kjer se izbrišejo presledki (problemi so bili pri večkratnem urejanju)
	  	}
	  	
	  	return t;
	}
			
	/**
	 * Funkcija ustvari prehod med različnimi Activity-ji.
	 * @param cnt je objekt klicočega razreda.
	 * @param cls tip novega razreda.
	 * @param id poslanega objekta na novi Activity.
	 */
	public static void gotoIntent(Context cnt, Class<?> cls, int id) {
		Intent intent = new Intent(cnt, cls);
		if (id > NO_EXTRAS)
		/* pošiljanje podatkov na drugi view - za urejanje */
			intent.putExtra("id", id);

        cnt.startActivity(intent);
	}
	
	/**
	 * Funkcija preveri, če je string veljaven za vpis v bazo.
	 * @param input string
	 * @return true, če je veljaven. Vrne false, če ni veljaven.
	 */
	public static boolean checkString(String input) {
		
		if(input == null || (input.trim().length() > 0))
			return false;
		else
			return true;
	}
	
	/**
	 * Funkcija očisti vnešen niz telefonske številke (odstrani črke in določene znake - po potrebi dodaj..).
	 * @param phoneNumbers arraylist številk
	 * @return očiščen arraylist številk
	 */
	public static ArrayList<String> cleanNumbers(ArrayList<String> phoneNumbers) {
		
		ArrayList<String> tmp = new ArrayList<String>();
		
		for (String number : phoneNumbers) {

			tmp.add(numberCleanUp(number));
			
		}
		
		return tmp;
		
	}
	
	/**
	 * Temp funkcija za izpis popup sporočil.
	 * @param context
	 * @param message
	 */
	public static void makeToastNotification(Context context, String message) { 
		Toast.makeText(context, message, Toast.LENGTH_LONG).show();
	}
	
	/**
	 * Funckija shrani SMS v Android bazo
	 * @param context
	 * @param msg object
	 */
	public static void saveSmsToOutbox(Context context, SMSMessage msg) {
		
		for(String recipient : msg.getRecipients()) {
		
			recipient = numberCleanUp(recipient);
			
			ContentValues values = new ContentValues();
	        values.put(ADDRESS, recipient);
	        values.put(DATE, System.currentTimeMillis());
	        values.put(READ, 1);
	        values.put(STATUS, -1);
	        values.put(TYPE, MESSAGE_TYPE_SENT);
	        values.put(BODY, msg.getMessage());
	        context.getContentResolver().insert(Uri.parse("content://sms/sent"), values);
        
		}
        
	}
	
	public static void showAlert(Context context, String title, String message) {
	
		new AlertDialog.Builder(context)
			.setTitle(title)
			.setMessage(message)
			.setNeutralButton("OK", new DialogInterface.OnClickListener() {
				public void onClick(
					DialogInterface dialog, int which) {}
				})
			.show();

	}
	
	public static boolean isConnected(Context context) {
	
		try {
		
			ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
			NetworkInfo info = cm.getActiveNetworkInfo();
			
			int netType = info.getType();
			
			// ali je wifi dovoljen?
			if(netType == ConnectivityManager.TYPE_WIFI && Settings.getAllowWifi(context)) {
			    
				return info.isConnected();
				
			// ali je mobile dovoljen?
			} else if(netType == ConnectivityManager.TYPE_MOBILE && Settings.getAllowMobile(context)) {
			        
				return info.isConnected();
				
			} else {
			    
				return false;
				
			}
			
		} catch(Exception e) {
		
			e.printStackTrace();
			return false;
			
		}

	}
	
	/**
	 * Funkcija pretvori arraylist avtorjev v navaden string z line-break-i
	 * @param authors
	 * @return String z vstavljenimi line-break-i
	 */
	public static String AuthorsToString(ArrayList<String> authors) {
		
		StringBuilder stringWithLineBreak = new StringBuilder();
		for(String author : authors) {
			stringWithLineBreak.append("- " + author + "\n"); // TODO: fix last line break
		}
		
		return stringWithLineBreak.toString();
	}
	
}